<?php
namespace Study\Design;
/**
 * 1、工厂方法
定义：定义一个用于创建对象的接口，让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
 * 在工厂模式中，我们在创建对象时不会对客户端暴露创建逻辑，并且是通过使用一个共同的接口来指向新创建的对象。
 */
class Factory
{
    //创建对象的接口
    public function CreateOrder($str):Order
    {

        switch ($str){
            case "ZhiFu":
                $result = new ZhiFuOrder();
                break;
            case "FeiZhiFu":
                $result = new FeiZhiFuOrder();
                break;
        }
        return $result;
    }
    function run(){
        $order = $this->CreateOrder("ZhiFu");
        echo $order->amount();
    }
}

interface  Order{
    public function amount();
}
class ZhiFuOrder implements Order{
    function __construct(){
        echo "this is ZhiFuOrder\n";
    }
    public function amount(){
        return 10;
    }
}
class FeiZhiFuOrder implements Order{
    function __construct(){
        echo "this is FeiZhiFuOrder\n";
    }
    public function amount(){
        return 20;
    }
}




